简书链接:原创cmake和Androidmk两种编译cc双编译的样板代码  文章字数:318,阅读全文大约需要1分钟
Android.mk 在gradle 安卓项目的build.gradle文件下的android{} 内插入
1 2 3 4 5 6 externalNativeBuild {    ndkBuild {                    path 'src/main/jni/Android.mk'                } 
 
在gradle 安卓项目的build.gradle文件下的android.defaultConfig{} 内插入
1 2 3 4 5 6 7 8 9 10 android{  defaultConfig {    ndkBuild {                     abiFilters "armeabi-v7a",'arm64-v8a','x86_64'                  abiFilters "armeabi-v7a",'arm64-v8a'                 }       }  } 
 
Cmake 在gradle 安卓项目的build.gradle文件下的android{} 内插入
1 2 3 4 5 6 externalNativeBuild {  cmake {                path "CMakeLists.txt"            } 
 
在gradle 安卓项目的build.gradle文件下的android.defaultConfig{} 内插入
1 2 3 4 5 6 7 8 9 10 11 12 android{  defaultConfig {                 cmake { //            arguments '-DBUILD_TESTING=OFF', '-DANDROID_TOOLCHAIN=gcc'                     arguments "-DANDROID_STL=c++_shared", "-DSHARED=false", "-DDEBUG=OFF", "-DFUCKDEBUG=ON", "-Wno-error=format-security" //打开hook zz日志。 //解决roid.injected.build.abi'gradle标志设置的ABIs [armeabi-v7a,armeabi]包含的'ARMEABI'不是此项目的目标                     cppFlags "-fexceptions", "-fpermissive", "-fno-exceptions"                           }  } } 
 
Android.mk内容概览 1 2 3 4 5 6 7 8 9 10 11 #APP_ABI := armeabi-v7a APP_ABI := armeabi armeabi-v7a x86 #APP_ABI := armeabi-v7a x86 #APP_ABI := armeabi-v7a x86 arm64-v8a APP_PLATFORM := android-14 APP_STL := c++_static APP_OPTIM := release VA_ROOT          := $(call my-dir) NDK_MODULE_PATH  := $(NDK_MODULE_PATH):$(VA_ROOT) 
 
Android.mk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 LOCAL_PATH := $(call my-dir) MAIN_LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := prncon # -DFUCKDEBUG open log LOCAL_CFLAGS := -Wno-error=format-security -fpermissive -DLOG_TAG=\"FUCK_QSSQ\" -DQSSQ_SAFE LOCAL_CFLAGS += -fno-rtti -fno-exceptions LOCAL_CPPFLAGS += -std=c++14 LOCAL_CFLAGS += -fvisibility=hidden # hidden LOCAL_C_INCLUDES += $(MAIN_LOCAL_PATH) LOCAL_C_INCLUDES += $(MAIN_LOCAL_PATH)/Foundation LOCAL_C_INCLUDES += $(MAIN_LOCAL_PATH)/Jni LOCAL_C_INCLUDES += $(MAIN_LOCAL_PATH)/Include LOCAL_SRC_FILES := Jni/VAJni.cpp \                     My/JniHelper.cpp \                     My/QSSQ_hkkq.cpp \                     My/base64.c \                     My/base6_with_test.c \                     My/bytesencrypt.cpp \ LOCAL_LDLIBS := -llog -latomic LOCAL_STATIC_LIBRARIES := fb include $(BUILD_SHARED_LIBRARY) include $(MAIN_LOCAL_PATH)/fb/Android.mk 
 
CmakeLists.txt文件概览 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 cmake_minimum_required(VERSION 3.4.1) set(CMAKE_CXX_STANDARD 14) #include_directories(src/main/cpp/Foundation) include_directories(src/main/cpp/include) include_directories(src/main/cpp/include_io_redirect) include_directories(src/main/cpp) add_subdirectory("src/main/cpp/hookzz") #[[message("compile  static lib ${PROJECT_SOURCE_DIR}") add_library(hookzzstatic STATIC  IMPORTED) set_target_properties(hookzzstatic         PROPERTIES IMPORTED_LOCATION         ${PROJECT_SOURCE_DIR}/libhookzz.a)]] message("------------------------------------------------") add_library( # Sets the name of the library.         qssqredirect         # Sets the library as a shared library.         SHARED         src/main/cpp/android/Foundation/JniHelper.cpp         src/main/cpp/QSSQ_hkkq.cpp         src/main/cpp/base64.c         src/main/cpp/bytesencrypt.cpp         ) find_library( # Sets the name of the path variable.         log-lib         # Specifies the name of the NDK library that         # you want CMake to locate.         log) target_link_libraries( # Specifies the target library.         qssqredirect         hookzz         # Links the target library to the log library         # included in the NDK.         ${log-lib} #        ${atomic-lib}         ) #add_definitions(-std=c++11) ENABLE_LANGUAGE(ASM) if (FUCKDEBUG)     message("---------open log FUCKDEBUG---------------")     add_definitions(-DFUCKDEBUG) endif () 
 
双支持 在项目build.gradle 下定义
 
在android项目build.gradle定义判断即可
gradle中 宏定义的读取 gradle.中
1 2 3                 cmake {                     arguments "-DFUCKDEBUG=ON", "-Wno-error=format-security" } 
 
cmakeList.txt
1 2 3 4 if (FUCKDEBUG)     message("---------open log FUCKDEBUG---------------")     add_definitions(-DFUCKDEBUG) 
 
android.mk
 
c代码
1 2 3    #if defined(FUCKDEBUG)         #pragma message("-----MY LOG_ ON----") #endif 
 
判断cpu架构的代码
1 2 3 4 5 6 7 8 9 __arm__             armeabi __arm__             armeabi-v7 __aarch64__         arm64-v8a __i386__            x86 __x86_64__          x86_64 # ifdef __arm__          #pragma message(" arm arch") #endif